﻿import QtQuick 2.0


// 注意：
// String 类型的对象是只读的，字符串的提取 查找 替换等操作，凡是牵涉到修改的动作，都返回新的字符串,而母串本身不会改变，
//另外 返回的值是伪对象，它可以使用string类的所有属性和方法
Rectangle{

    Component.onCompleted: {
        var str = new String("I\'m a string");
        //字符串长度
        console.log("字符串长度");
        console.log(str," size:", str.length); //12 不算转义字符，算空格

        //访问单个字符
        console.log("访问单个字符");
        console.log(str.charAt(2)); //m
        console.log(str[2]); //m
        console.log(str.charCodeAt(2));//109

        //查找子串 indexOf() 从头开始检索，lastIndex() 从末尾检索，找不到返回-1
        //都存在一个可选的参数，指定开始查找的位置
        //serch（） 检索字符串中指定的子字符串，或者检索与正则表达式相匹配的子字符串，区分大小写总是从开始查找
        //match() 再字符串内检索指定的值，或者寻找匹配指定正则表达式的一个或者多个子串，如果检索到了符合规则的子串，他会返回一个存放所有字串的数组
        //都区分大小写
        console.log("查找子串");
        console.log(str.indexOf("str")); //6
        console.log(str.indexOf("str", 4)); //6
        console.log(str.search(/String/)); //-1
        console.log(str.lastIndexOf(" ")) //5
        console.log(str.search(/String/i));// 忽略大小写，输出6
        console.log(str.search("i")); //输出9 而非0
        console.log(str.match("tri")); //输出[tri]

        var numberSource = new String("2018-12-24, I got 96");
        var results = numberSource.match(/\d+/g);
        console.log(results.length); //输出4
        console.log(results); //输出[2018,12,24,96]



        //字符串比较
        console.log("字符串比较");
        //localeCompare() //在使用时，默认采用底层操作系统提供的排序规则 相等返回0 小于 返回小于0的值（-1）
        //大于返回大于0的值（1）
        var str1 = "Qt quick";
        var str2 = "qt quick";
        var str3 = "ok";

        console.log(str1 == str2); //输出false
        console.log(str1 < str2); //输出true
        console.log(str1.localeCompare(str2));//输出1
        console.log(str3.localeCompare(str2)); //输出-1

        //连接两个字符串 concat() 连接两个或者多个字符串，返回一个新的字符串原始值
        console.log("连接两个字符串");
        var str4 = new Object("Qt");
        var str5 = "Quick";
        var strResult = str1.concat(str2, ":is"," great!");
        console.log(strResult) //Qt Quick
        console.log(str1);
        console.log(str1.concat(" windows"));
        console.log(str + str3);

        //填充字符
        //使用Array对象存储字符串，然后调用Array的join（）方法

        console.log("提取子串");
        //提取子串
        //string slice和substring两个方法提取子串
        // 第一个参数 起始位置 结束位置（提取的子串不包含该位置的字符），
        // 如果忽略第二个参数，结束位置默认为字符串的长度
        //slice 和substring 这两个方法的不同之处在于对负数参数的处理，
        // slice遇到负数参数时, 会应用 从串尾倒数 这种策略，
        //比如slice(-3)会提取母串的后三个字符作为子串
        //substring 方法会把负数作为参数0处理， substring总是把较小的参数
        //作为起始位置， 比如substring(3,1)与substring(1,3)效果一样

        //还有一个方法 substr() 也可以提取子串，它的第一个参数指定起始位置，
        //第二个参数指定要提取的字符个数，如果不指定 会返回从起始位置到母串结束的所有字符


        var source  = new String("I like QML");

        console.log(source.slice(-3)); //QML
        console.log(source.slice(2, 6)); //like
        console.log(source.substring(0,6));//I like
        console.log(source.substring(6,0));// I like
        console.log(source.substring(-3)); //I like QML //-3当作0处理，作为起始位置
        console.log(source.substring(4, -3)); //I li
        console.log(source.slice(4, -3));//"ke" 从0开始数
        console.log(source.substr(2, 4));//like //起始位置，个数


        //转小写 toLowerCase() 或者 toLocaleLowerCase()
        // 转大写 toUpperCase() 或 toLocaleUpperCase()
        //其中toLocaleXXX方法基于特定的区域实现，与localeCompare()类似

        console.log("大小写转换");
        var orig = "Qt Quick";
        console.log(orig.toLocaleLowerCase());
        console.log(orig.toLowerCase());
        console.log(orig.toLocaleUpperCase());
        console.log(orig.toUpperCase());

        //字符串替换
        //replace 方法可以将母串中的部分字串替换尾指定的新字符串
        // 第一个参数: 被替换的串， 或者正则， 第二个参数 新串
        console.log("字符串替换");

        var strSource = new String("Android, best");
        //下面语句输出 "IOS, best"
        console.log(strSource.replace("Android", "ios"));
        //下面语句输出 "Android,worst"
        console.log(strSource.replace(/best/, "worst"));

        // 使用arg()进行值替换
        //string arg(value) //value 可以始 数字 字符串， bool 对象等 替换 %1 %2
        // bool 会替换成1或0;
        // 对于对象 需要使用toString() 方法转换后的结果来替换对应的占位符
        console.log("使用arg()进行替换");
        var expression = "%1 < %2 = %3";
        var result = expression.arg(7).arg(8).arg("true");
        console.log(result);
        console.log(expression.arg(10).arg(6).arg(false));
        console.log("I am %1 years old.".arg(10));

    }
}
